// 封装请求方法
// 导入axios
import axios from 'axios';
// 导入store
import store from '@/store';
// 导入router
import router from '@/router';
// 导入vant轻提示
import { Toast } from 'vant';

const baseURL = 'http://toutiao.itheima.net';

// 创建一个新的请求对象，并设置基地址
const request = axios.create({
	baseURL,
});

// 添加响应拦截器，为了剥离数据
request.interceptors.response.use(
	(response) => {
		// 正常响应会调用的回调函数
		return response.data;
	},
	async (error) => {
		// 判断错误是不是401错误
		if (error.response.status == 401) {
			try {
				// 代表token有问题，有问题就用refresh_token去问服务器要一个新的token
				const res = await axios({
					url: `baseURL/v1_0/authorizations`,
					method: 'put',
					headers: {
						Authorization: 'Bearer ' + store.state.tokenObj.refresh_token,
					},
				});

				// 把最新的token和原本的refresh_token存到vuex与本地存储
				store.commit('changeToken', {
					token: res.data.data.token,
					refresh_token: store.state.tokenObj.refresh_token,
				});
				console.log(request(error.config));
				// 把原本的请求，再请求一次
				// 因为error.config里面保存了我们第一次请求的所有信息
				// 因此可以利用起来重新请求
				return request(error.config);
			} catch {
				// 当refrsh_token也失效时，提示用户重新登录
				Toast('登录信息已失效，请重新登录');
				router.push('/login');
			}
		} else {
			// 响应出错调用的回调函数
			return Promise.reject(error);
		}
	}
);

// 添加请求拦截器
request.interceptors.request.use(
	function (config) {
		// 在发送请求之前做些什么
		if (store.state.tokenObj.token) {
			config.headers.Authorization = 'Bearer ' + store.state.tokenObj.token;
		}
		return config;
	},
	function (error) {
		// 对请求错误做些什么
		return Promise.reject(error);
	}
);

// 暴露出去
export default request;
